package labirynthPackage;

/**
 *
 * @author Biserova Ekaterina, Baburkina Anastasia, Perminov Alexander
 */
public class Point {
    public int y,  x;
    public Point parent;
    public boolean start;
    public boolean finish;
    /**
     * стоимость передвижения из стартовой точки A к данной клетке
     */
    public int G = 0;
    /**
     * Примерная стоимость передвижения от данной клетки до целевой
     */
    public int H = 0;
    /**
     * Сумма двух предыдущих стоимостей
     */
    public int F = 0;
    /**
     * Конструктор с параметрами
     * @param y
     * @param x 
     */
    Point(final int y, final int x) {
        this.y = y;
        this.x = x;
        F = 0;
        G = 0;
        H = 0;
        start = false;
        finish = false;
        parent = this;
    }
    
    @Override
    public boolean equals(Object p){
        if(p instanceof Point)
        {
            Point pp = (Point)p;
            if (y == pp.y & x == pp.x) {
                return true;
            } else {
                return false;
            }
        }else{
            return false;
        }
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 17 * hash + this.y;
        hash = 17 * hash + this.x;
        return hash;
    }
    
    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder(); 
        sb.append(y).append(",").append(x);
        return sb.toString();
    }
    
    /**
     * Вычисление стоимости пути до соседней клетки finish
     * @param finish соседняя клетка
     * @return 10, если клетка по горизонтали или вертикали от текущей
     */
    public int price(Point finish) {
            return 10;
    }
    
    public void move(Direction dir) {
        switch (dir) {
            case Down:
                y = y + 1;
                break;
            case Up:
                y = y - 1;
                break;
            case Left:
                x=x - 1;
                break;
            case Right:
                x = x + 1;
                break;
        }
    }
    
     /**
     * Функция вычисления манхеттенского расстояния от текущей
     * клетки до finish
     * @param finish конечная клетка
     * @return расстояние
     */
    public int mandist(Point finish) {
        return 10 * (Math.abs(this.x - finish.x) + Math.abs(this.y - finish.y));
    }

    /**
     * Устанавливает текущую клетку как стартовую
     */
    public void setAsStart() {
        this.start = true;
    }

    /**
     * Устанавливает текущую клетку как конечную
     */
    public void setAsFinish() {
        this.finish = true;
    }
}

   

